package com.arialyy.frame.core;

import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.support.annotation.NonNull;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.PopupWindow;

import com.arialyy.frame.module.AbsModule;
import com.arialyy.frame.module.IOCProxy;
import com.arialyy.frame.util.StringUtil;

import butterknife.ButterKnife;

/**
 * Created by lyy on 2015/12/3.
 * 抽象的Popupwindow悬浮框
 */
public abstract class AbsPopupWindow extends PopupWindow {

    protected      String             TAG;
    private static Context            mContext;
    private        Drawable           mBackground;
    protected      View               mView;
    private        Object             mObj;
    protected      IOCProxy           mProxy;
    protected      DialogSimpleModule mSimpleModule;
    private        ModuleFactory      mModuleF;

    public AbsPopupWindow(Context context) {
        this(context, null);
    }

    public AbsPopupWindow(Context context, Drawable background) {
        this(context, background, null);
    }

    public AbsPopupWindow(Context context, Drawable background, Object obj) {
        mContext = context;
        mBackground = background;
        initPopupWindow();
        mProxy = IOCProxy.newInstance(this);
        if (obj != null) {
            mObj = obj;
            mSimpleModule = new DialogSimpleModule(getContext());
            IOCProxy.newInstance(mObj, mSimpleModule);
        }
        mModuleF = ModuleFactory.newInstance();
        init();
    }

    protected void init() {

    }

    private void initPopupWindow() {
        mView = LayoutInflater.from(mContext).inflate(setLayoutId(), null);
        setContentView(mView);
        ButterKnife.inject(this, mView);
        TAG = StringUtil.getClassName(this);
        // 设置SelectPicPopupWindow弹出窗体的宽
        setWidth(ViewGroup.LayoutParams.MATCH_PARENT);
        // 设置SelectPicPopupWindow弹出窗体的高
        setHeight(ViewGroup.LayoutParams.MATCH_PARENT);
        setFocusable(true);
        // 设置SelectPicPopupWindow弹出窗体动画效果
//        setAnimationStyle(R.style.wisdom_anim_style);
        // 实例化一个ColorDrawable颜色为半透明
        if (mBackground == null) {
            mBackground = new ColorDrawable(Color.parseColor("#7f000000"));
        }
        // 设置SelectPicPopupWindow弹出窗体的背景
        setBackgroundDrawable(mBackground);
    }

    protected <T extends View> T getViewWithTag(Object tag) {
        T result = (T) mView.findViewWithTag(tag);
        if (result == null)
            throw new NullPointerException("没有找到tag为【" + tag + "】的控件");
        return result;
    }

    /**
     * 获取Module
     *
     * @param clazz {@link AbsModule}
     */
    protected <M extends AbsModule> M getModule(Class<M> clazz) {
        M module = mModuleF.getModule(getContext(), clazz);
        mProxy.changeModule(module);
        return module;
    }

    /**
     * 获取Module
     *
     * @param clazz    Module class0
     * @param callback Module回调函数
     * @param <M>      {@link AbsModule}
     * @return
     */
    protected <M extends AbsModule> M getModule(@NonNull Class<M> clazz, @NonNull AbsModule.OnCallback callback) {
        M module = mModuleF.getModule(getContext(), clazz);
        module.setCallback(callback);
        mProxy.changeModule(module);
        return module;
    }

    /**
     * 获取简单打Moduel回调，这个一般用于回调数据给寄主
     */
    protected DialogSimpleModule getSimplerModule() {
        if (mObj == null) {
            throw new NullPointerException("必须设置寄主对象");
        }
        return mSimpleModule;
    }

    public Context getContext() {
        return mContext;
    }

    /**
     * 设置资源布局
     *
     * @return
     */
    protected abstract int setLayoutId();

    /**
     * 数据回调
     */
    protected abstract void dataCallback(int result, Object obj);


}
